package com.yue.modal;

import com.mysql.cj.xdevapi.StreamingSqlResultBuilder;
import com.yue.bean.UserInfoBean;
import com.yue.dao.DBProvider;
import com.yue.utils.MyUtils;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class UserModel {
    /**
     * 根据ID查询用户信息
     *
     * @return 查询结果
     */
    public UserInfoBean queryUserInfoById(String strId) {
        UserInfoBean userInfoBean = null;
        // 查询语句
        String strSql = " select * from userinfo where userID = ? ";
        userInfoBean = MyUtils.getNewInstance(DBProvider.class).query(strSql, new BeanHandler<>(UserInfoBean.class), strId);
        return userInfoBean;
    }

    /**
     * 根据条件查询用户信息
     *
     * @param userInfoBean 查询条件实体bean
     * @return 查询结果集
     */
    public List<UserInfoBean> queryUserInfoByParams(UserInfoBean userInfoBean) {
        List<UserInfoBean> lst = new ArrayList<>();

        // 查询语句---根据查询条件进行动态拼接
        // 定义一个存储占位符参数的集合List
        List lstParmas = new ArrayList();

        /*
        select * from userinfo where 1=1 AND userName LIKE '%a%' AND userTel LIKE '%13%'
AND userRegisteDate >= '2021-04-01' AND userRegisteDate <= '2021-04-05'
         */
        StringBuilder sbSql = new StringBuilder(" select * from userinfo where 1=1 ");
        if (userInfoBean != null) {
            // 动态拼接sql语句
            // 用户名
            if (userInfoBean.getUserName() != null && !userInfoBean.getUserName().equals("")) {
                sbSql.append(" AND userName LIKE ? ");
                // 拼接占位符参数
                lstParmas.add("%" + userInfoBean.getUserName() + "%");
            }

            // 联系电话查询
            if (StringUtils.isNotEmpty(userInfoBean.getUserTel())) {
                sbSql.append(" AND userTel LIKE ? ");
                // 拼接占位符参数
                lstParmas.add("%" + userInfoBean.getUserTel() + "%");
            }

            // 开始日期
            if (userInfoBean.getUserRegisteDate() != null) {
                sbSql.append(" AND userRegisteDate >= ? ");
                // 拼接占位符参数
                lstParmas.add(DateFormatUtils.format(userInfoBean.getUserRegisteDate(), "yyyy-MM-dd HH:mm:ss"));
            }

            // 截止日期
            if (userInfoBean.getUserRegisteDate2() != null) {
                sbSql.append(" AND userRegisteDate <= ? ");
                // 拼接占位符参数
                lstParmas.add(DateFormatUtils.format(userInfoBean.getUserRegisteDate2(), "yyyy-MM-dd HH:mm:ss"));
            }
        }
        // 排序
        sbSql.append(" order by userid desc ");
        // 查询操作
        lst = MyUtils.getNewInstance(DBProvider.class).query(sbSql.toString(), new BeanListHandler<>(UserInfoBean.class), lstParmas.toArray());
        return lst;
    }

    /**
     * 查询所有的用户信息
     *
     * @return 查询结果集
     */
    public List<UserInfoBean> queryUserInfoAll() {
        List<UserInfoBean> lst = new ArrayList<>();
        // 查询语句
        String strSql = " select * from userinfo order by userid desc ";
        lst = MyUtils.getNewInstance(DBProvider.class).query(strSql, new BeanListHandler<>(UserInfoBean.class));
        return lst;
    }

    /**
     * 用户信息新增
     *
     * @param userInfoBean 参数实体类
     * @return 数据保存成果的记录
     */
    public int saveUserInfo(UserInfoBean userInfoBean) {

        // 默认返回值
        int i = 0;
         /*
        这个方法，既可以处理新增业务逻辑，也可以处理修改业务逻辑：
        新增和修改的区别：
            新增时参数实体bean userinfobean 的主键字段的值 为null;
            修改时参数实体bean userinfobean 的主键字段的值 不为null;

         */
        if (userInfoBean.getUserId() != null) {
            // 主键字段不为null ，进行修改操作
            // 修改操作的sql语句
            String strSql = "UPDATE userinfo SET userName = ? , userPsw=?,userTel=?,userRegisteDate=? WHERE userId = ?";
            // 调用数据库操作dao层进行数据库保存处理
            i = MyUtils.getNewInstance(DBProvider.class).execute(strSql, new Object[]{
                    userInfoBean.getUserName(), userInfoBean.getUserPsw(), userInfoBean.getUserTel()
                    , userInfoBean.getUserRegisteDate(), userInfoBean.getUserId()
            });
        } else {
            // 主键字段为null，则进行新增操作
            // 数据保存的sql语句
            String strSql = "INSERT into userinfo(userName,userPsw,userTel,userRegisteDate) VALUES(?,?,?,?)";
            // 调用数据库操作dao层进行数据库保存处理
            i = MyUtils.getNewInstance(DBProvider.class).execute(strSql, new Object[]{
                    userInfoBean.getUserName(), userInfoBean.getUserPsw(), userInfoBean.getUserTel()
                    , MyUtils.convertDate2String(userInfoBean.getUserRegisteDate(), "yyyy-MM-dd HH:mm:ss")  // 需要把日期 Date类型转换为字符串
            });
        }
        return i;
    }


    /**
     * 验证用户是否登录成功
     *
     * @param userName 用户名
     * @param userPsw  密码
     * @return 验证结果
     */
    public boolean doLogin(String userName, String userPsw) {
        // 默认返回值
        boolean canLogined = false;

        // 查询sql语句
        String strSql = "SELECT * FROM userinfo WHERE username = ? AND userpsw = ?";
        // 创建查询器对象
        //DBProvider dbProvider = new DBProvider();
        //List<Map<String, Object>> list = MyUtils.getNewInstance(DBProvider.class).queryListMap(strSql, userName, userPsw);
        List<Map<String, Object>> list = MyUtils.getNewInstance(DBProvider.class).query(strSql, new MapListHandler(), userName, userPsw);
        // 判断是否登录成功
        if (list != null && list.size() > 0) {
            // 登录成功
            canLogined = true;
        }
        // 返回值
        return canLogined;
    }

}